﻿#ifndef CMDANALYSIS_H
#define CMDANALYSIS_H
#include <Windows.h>
#include <QApplication>
#include <QHash>
#include <iostream>
#include <QTextCodec>
#include <qdebug.h>
#include <QMutexLocker>
#include <StdClassFun.h>
#include <ThreadShowChangeFiles.h>
#include <QtConcurrent/QtConcurrent>
#include <QThread>
#include <QFuture>
#include "CmdAnalysis_global.h"

class CMDANALYSIS_EXPORT CmdAnalysis : public QApplication {
Q_OBJECT;
	// 命令行
	QHash<QString, QVector<QString>> parameter;
	// 当前程序
	QString currentExeName;
	QVector<QString> regExpAppendVector;
	QVector<QString> normalFilterAppendVector;
	QString addTimeSparation = " ";
	QString addDataSparation = " ";
	// 目标目录
	QVector<QString> destPtahVector;
	// 文件操作
	int fileOpterator = 0;
private:
	void anasyParameter(int& argc
		, char** argv);
	bool releaseObj(QObject* obj = Q_NULLPTR);
public:
	CmdAnalysis(int& argc
		, char** argv
		, int i = ApplicationFlags);
	int appRun( );
	virtual ~CmdAnalysis( );

	const QHash<QString, QVector<QString>>* getParameter( ) const {
		return &parameter;
	}

	QMutex* mutex;
	/* 处理信号 */
public:

	// 获取所有被更改的文件信息
	// fileChangeInfo 文件信息
	// fileParh 查找路径
	void showChangeFilesInfo(QHash<QString, QDateTime>* fileChangeInfo
		, QString* fileParh);

	// 释放线程
	void realeaseThread(QThread* obj);
private: // 选项与说明
	// 创建目录
	const char* creatorPathOption = "-creatorPath";
	const char* mkPathOption = "-mkPath";
	const char* creatorPathOptionHelp = "可以创建指定目录";
	// 拷贝到目标的目录
	const char* copyDestOption = "-copyDest";
	const char* copyDestPathOptionHelp = "可以设置拷贝目标(只允许拷贝文件)";
	// 移动到到目标的目录
	const char* moveDestOption = "-moveDest";
	const char* moveDestOptionHelp = "可以设置移动目标，原有文件将会消失(只允许移动文件)";
	// 时间分隔符
	const char* setChangeTimeSparationOption = "-setChangeTimeSparation";
	const char* setChangeTimeSparationOptionHelp = "可以设置当前时间(时 分 秒)的判定分隔符";
	// 日期分隔符
	const char* setChangeDataSparationOption = "-setChangeDataSparation";
	const char* setChangeDataSparationOptionHelp = "可以设置当前时间(年 月 日)的判定分隔符";
	// 设置对比更改时间
	const char* setChangeTimeOption = "-setChangeTime";
	const char* setChangeTimeOptionHelp = "设置文件对比的更改时间";
	// 设置对比更改日期
	const char* setChangeDateOption = "-setChangeDate";
	const char* setChangeDateOptionHelp = "设置文件对比的更改天数";
	// 年份添加选项
	const char* addYearOption = "-addYear";
	const char* addYearOptionHelp = "在原有检查的更改年份基础上添加指定年份";
	// 月份添加选项
	const char* addMonthOtion = "-addMonth";
	const char* addMonthOtionHelp = "在原有检查的更改月份基础上添加指定月份";
	// 天数添加选项
	const char* addDayOption = "-addDay";
	const char* addDayOptionHelp = "在原有检查的更改天数基础上添加指定天数";
	// 小时添加选项
	const char* addHourOption = "-addHour";
	const char* addHourOptionHelp = "在原有检查的更改小时基础上添加指定小时";
	// 分钟添加选项
	const char* addMinuteOption = "-addMinute";
	const char* addMinuteOptionHelp = "在原有检查的更改分钟基础上添加指定分钟";
	// 秒数添加选项
	const char* addSecondOption = "-addSecond";
	const char* addSecondOptionHelp = "在原有检查的更改秒数基础上添加指定秒数";
	// 毫秒添加选项
	const char* addMsecOption = "-addMsec";
	const char* addMsecOptionHelp = "在原有检查的更改毫秒数基础上添加指定毫秒数";
	// 输出格式化
	const char* formOption = "-form";
	const char* formOptionHelp = R"(
		可以指定的输出格式
			%fileName%
				文件名
			%baseName%
				基础文件名
			%absolutePath%
				父目录绝对路径
			%suffix%
				后缀
			%absoluteFileName%
				绝对文件名
			%changeDateTime%
				日期时间
		)";
	// 日期时间输出格式化
	const char* formDateTimeOption = "-formDateTime";
	const char* formDateTimeOptionHelp = R"(
		设置日期与时间的输出格式化，需要在 -form 中指定 %changeDateTime%
		AP or A
			显示 AM/PM    
		ap or a
			显示 am/pm
		h
			显示 0~23 小时，需要显示 0~12 时，需要同时显示 AM/PM
		hh
			显示 00~23 小时，需要显示 0~12 时，需要同时显示 AM/PM
		H
			显示 0~23 小时，需要显示 0~12 时，需要同时显示 AM/PM
		HH
			显示 00~23 小时，需要显示 0~12 时，需要同时显示 AM/PM
		m
			显示 0~59 分钟
		mm
			显示 00~99 分钟
		s
			显示 0~59 秒
		ss
			显示 00 ~99 秒
		z
			显示 0~999 毫秒
		zzz
			显示 0000~999 毫秒
		t
			显示当前时区    
		d
			显示 1~31 日期
		dd
			显示 01~31 日期
		ddd
			短写文字显示日期
		dddd
			长写文字显示日期
		M
			1~12 月
		MM
			01 ~ 12 月
		MMM
			短写月份    
		MMMM
			长写月份    
		yy
			00~99年份
		yyyy
			0000~9999年份
		
		支持拼接字符串
			0000 yyyy 显示 0000 2020   
			年份 yyyy 显示 年份 2020)";
	// 后缀查找
	const char* fileterSuffixOption = "-fileterSuffix";
	const char* fileterSuffixOptionHelp = "设置尾过滤\n\t\t如：-fileterSuffix .log 效果等同 -filter *.log";
	// 一般过滤
	const char* filterOption = "-filter";
	const char* filterOptionHelp = "设置一般过滤\n\t\t如果使用制表符等,请使用双引号";
	// 一般过滤分隔符
	const char* filterSparationOption = "-filterSparation";
	const char* filterSparationOptionHelp = "可以设置一般过滤的多个参数的分隔符";
	// 正则表达式
	const char* regExpOption = "-regExp";
	const char* regExpOptionHelp = "设置好正则表达式\n\t\t如果使用制表符等,请使用双引号";
	// 正则表达式分隔符
	const char* regExpSparationOption = "-regExpSparation";
	const char* regExpSparationOptionHelp = "可以设置正则表达式多个参数的分隔符";
	// 调试选项
	const char* debugOutOption = "-outparam";
	const char* debugOutOptionHelp = "输出用户选项";
};
#endif // CMDANALYSIS_H
